/**
 * 全局方法 通过 $util调用
 * */

const prompt = require('@system.prompt');
const shortcut = require('@system.shortcut');
const wxaccount = require("@service.wxaccount");

let timer = null;
let vm = null;
export default {

  /**
   * 什么都不做
   * */
  nothing() {
  },

  /**
   * 显示菜单
   * @param menuList {Array} 菜单列表
   * @param callback {Function} 点击回调
   */
  showMenu(menuList = [], callback) {
    callback = callback || this.nothing;
    prompt.showContextMenu({
      itemList: menuList,
      success: callback
    })
  },

  /**
   * 创建桌面图标
   * 注意：使用加载器测试`创建桌面快捷方式`功能时，请先在`系统设置`中打开`应用加载器`的`桌面快捷方式`权限
   */
  createShortcut() {
    shortcut.hasInstalled({
      success: function (ret) {
        if (ret) {
          prompt.showToast({
            message: '已创建桌面图标'
          })
        } else {
          shortcut.install({
            success: function () {
              prompt.showToast({
                message: '成功创建桌面图标'
              })
            },
            fail: function (errmsg, errcode) {
              prompt.showToast({
                message: `${errcode}: ${errmsg}`
              })
            }
          })
        }
      }
    })
  },

  /**
   * 全局toast弹框
   * @param obj {Object | String} 弹框内容
   * */
  toast(obj) {
    console.log(obj);
    typeof obj !== 'object' && (obj = {message: obj});
    prompt.showToast(obj);
  },


  /**
   * @desc 返回当前日期的相对时间段
   * @function
   * @params {number/string} val:
   *         类型 n(近n天) , tm(本月), ty(本年), nlm(前n月), nly(前n年), nm(近n月), ny(近n年)
   * @params {number/string/date} [date]:
   *         基本日期，默认不传，即为当天
   * @return {array} [start(00:00:00), end(23:59:59)]
   */
  typeToDate(val, date) {
    if (typeof val !== 'number' && typeof val !== 'string') return [,];
    let start = date ? new Date(date) : new Date();
    let end = date ? new Date(date) : new Date();
    let num = parseInt(val);
    if (!isNaN(val)) {
      // 近num天 num
      val && start.setDate(start.getDate() - num);
    } else if (/tm$/i.test(val)) {
      // 本月 tm
      start.setDate(1);
      end.setMonth(end.getMonth() + 1);
      end.setDate(0);
    } else if (/ty$/i.test(val)) {
      // 本年 ty
      start.setMonth(0);
      start.setDate(1);
      end.setMonth(11);
      end.setDate(31);
    } else if (/l$/i.test(val)) {
      // 前num天 nl
      end.setDate(end.getDate() - 1);
      start.setDate(start.getDate() - num);
    } else if (/lm$/i.test(val)) {
      // 前num个月 nlm
      end.setDate(0);
      start.setMonth(start.getMonth() - num);
      start.setDate(1);
    } else if (/ly$/i.test(val)) {
      // 前num年 nly
      end.setMonth(-1);
      end.setDate(31);
      start.setFullYear(start.getFullYear() - num);
      start.setMonth(0);
      start.setDate(1);
    } else if (/m$/i.test(val)) {
      // 近num月 nm
      start.setMonth(start.getMonth() - num);
    } else if (/y$/i.test(val)) {
      // 近num年 ny
      start.setFullYear(start.getFullYear() - num);
    }
    let arr = [start, end];
    arr = arr.map((d, i) => new Date(this.formatDate(d, 'Y-M-D ' + (!i ? '00:00:00' : '23:59:59'))));
    return arr;
  },

  /**
   * @desc 10位时间戳转化为年Y 月M 日D 时H 分m 秒s 毫秒S
   * @function
   * @params {number/date} number: 传入10位时间戳 / Date对象
   * @params {string} [format]：返回格式
   * @return {string}
   */
  formatDate(number, format = 'Y-MM-DD HH:mm:ss') {
    let time = number instanceof Date ? number : !isNaN(number) ? new Date(number * 1000) : false;
    if (time === false) return '';
    let obj = {
      'Y': time.getFullYear(),
      'M': time.getMonth() + 1,
      'W': ['七', '一', '二', '三', '四', '五', '六'][time.getDay()],
      'w': time.getDay() || 7,
      'D': time.getDate(),
      'A': time.getHours() > 12 ? 'PM' : 'AM',
      'a': time.getHours() > 12 ? 'pm' : 'am',
      'H': time.getHours(),
      'h': time.getHours() % 12 || 12,
      'm': time.getMinutes(),
      's': time.getSeconds(),
      'S': time.getTime() % 1000,
    };
    format = format.replace(/([YMWDAHSwahms])\1*/g, e => e.length === 2 && !/[SaAWw]/g.test(e) ? ('00' + obj[e[0]]).slice(-2) : obj[e[0]]);
    return format;
  },

  /**
   * @desc 毫秒数转时间 (日D 时H 分m 秒s 毫秒S)
   * @param {number} number 要转换的毫秒数
   * @param {string} [format] 转换的格式
   * @return String
   * */
  numberToTime(number, format = 'HH:mm:ss') {
    number = isNaN(number) ? 0 : (number || 0);
    let regs = {
      S: number | 0,
      s: number / 1000 | 0,
      m: number / 1000 / 60 | 0,
      H: number / 1000 / 60 / 60 | 0,
      D: number / 1000 / 60 / 60 / 24 | 0,
    };
    // 保留要输出的最高位 如：防止 format = 'mm:ss' 时 '60:00' 变为 '00:00'
    if (format.indexOf('s') >= 0) regs.S %= 1000;
    if (format.indexOf('m') >= 0) regs.s %= 60;
    if (format.indexOf('H') >= 0) regs.m %= 60;
    if (format.indexOf('D') >= 0) regs.H %= 24;

    format = format.replace(/([smhd])\1*/ig, e => {
      let val = regs[e[0]] || 0;
      val += '';
      if (e.length === 2 && val.length < 2) {
        return e.indexOf('S') < 0 ? '0' + val : val.slice(0, 2);
      } else {
        return val;
      }
    });
    return format;
  },

  /**
   * @desc 获取服务信息
   * @param {string} [key] 要获取的字段名称 不传返回包含所有key的对象
   *
   * @return Promise
   * */
  getAboutUs(key) {
    return $http.$post('api/product/get_service_info').then(res => {
      let info = {};
      res.forEach(item => {
        info[item.name] = item.value;
      });
      return key ? info[key] : info;
    });
  },

  /**
   * @desc 获取用户详情
   * @param {function} [callback] 获取成功回调
   *
   * @return Promise
   * */
  getUserInfoApi(callback) {
    $store('userInfo').then(res => {
      if (res.id || res.uid) {
        $http.$post('api/user/get_user_data', {
          uid: res.id || res.uid,
          product_id: $config.product_id,
          terminal_id: $config.terminal_id,
        }).then(userInfo => {
          let user = {...res, ...userInfo};
          $store('userInfo', user);
          typeof callback === 'function' && callback(user);
        }).catch(console.log);
      }
    }).catch(console.log);
  },

  /**
   * @desc 列表不足一行时要补充的数组
   * @param {number} total 总个数
   * @param {number} cols 列表数
   *
   * @return Array
   * */
  notThingCount(total, cols) {
    let num = total % cols;
    return '*'.repeat(num ? cols - num : 0).split('');
  },


  /**
   * @desc 分享
   * @param {number | string | array} [where] 分享到 0: WEIXIN, 1: WEIXIN_CIRCLE , 'all': ['WEIXIN', 'WEIXIN_CIRCLE']
   * @param {string | object} [config] 分享配置
   *
   * @return Promise
   * */
  share(where = [], config) {
    return new Promise((res, req) => {
      if (!$shareSe.getProvider()) {
        return req({msg: '因厂商限制，暂不支持分享', code: 400});
      }
      if (!config) {
        config = {
          shareType: 0,
          title: '孩子上课没听懂？课后辅导难？同步小学课堂帮到你！',
          summary: "同步小学课堂是专门为小学生设计的在线学习辅导软件，内含全国近200个版本的小学同步名师精讲课程，再也不用担心上课听不懂，学不会了",
          targetUrl: 'https://sj.qq.com/myapp/detail.htm?apkName=com.wyt.iexuetang.hd.xxtb', // 点击后的跳转 URL
          imagePath: '/common/logo.png', // 分享图片/缩略图的本地地址; 另外可支持分享在线图片的 url
        };
      }
      let platforms = ['WEIXIN', 'WEIXIN_CIRCLE'];
      $shareSe.share({
        platforms: where === 'all' ? platforms : Array.isArray(where) ? where : [platforms[where] || where],
        fail(data, code) {
          res({data, code});
          // code: 200
          // success
          // $util.toast('错误码:' + code);
        },
        ...config,
      })
    });
  },

  /**
   *  @desc 定时器
   *  @param num {number} 分钟
   */
  startTimer(num) {
    let time = num * 60;
    clearInterval(timer);
    timer = setInterval(() => {
      --time;
      if (time <= 0) {
        this.dialog('护眼提醒', `你已经连续学习了${num}分钟休息一会，放松下眼睛再回来吧~`);
        this.stopTimer(true);
      }
    }, 1000);
  },

  /**
   *  @desc 关闭定时器
   *  @param type {Boolean} 判断是否需要清除缓存
   */
  stopTimer(type) {
    clearInterval(timer);
    timer = null;

    if (type) {
      $store('isChecked', '');
      $store('time', '');
      vm && vm.timeOut && vm.timeOut(false);
    }
  },
  setVm(page) {
    vm = page;
  },

  /**
   * 全局dialog对话框
   * @param {string} title 弹框标题
   * @param {string} message 弹框内容
   * @param {boolean} [autocancel = true] 是否在点击遮罩时关闭对话框
   * @param [buttons] 按钮
   *
   * @return Promise
   * */
  dialog(title, message, buttons, autocancel = true) {
    if (!buttons || !Array.isArray(buttons)) {
      buttons = [
        {
          text: '确定',
          color: '#16d5ed'
        }
      ]
    }
    return new Promise((success, cancel) => {
      prompt.showDialog({
        title,
        message,
        buttons,
        autocancel,
        success,
        cancel,
      });
    });
  },

  /**
   * 微信登录
   * */
  wxLogin() {
    let ranState = 'state_' + (Math.random() * 99999 | 0);
    return new Promise((res, req) => {
      if (wxaccount.getType() !== 'NONE') {
        wxaccount.authorize({
          scope: 'snsapi_userinfo',
          state: ranState,
          success({code, state, lang, country}) {
            if (state === ranState) {
              $http.$post('api/weixin_login/app_login', {
                code,
                third_id: 1,
                terminal_id: $config.terminal_id,
                channel_id: $config.channel_id,
                product_id: $config.product_id,
              }).then(res).catch(req);
            } else {
              req({code: 401, msg: '校验失败'});
            }
          },
          fail(data, code) {
            let msg = '登录失败';
            switch (+code) {
              case -2004:
                msg = '用户拒绝授权';
                break;
              case -2006:
                msg = 'rpk 签名和微信后台签名不符或者无权限';
                break;
              case 1000:
                msg = '微信未安装';
                break;
              case 1001:
                msg = '接口声明中没有配置 appId';
                break;
            }
            req({code, msg})
          },
          cancel() {
            req({code: -2004, msg: '用户拒绝授权'});
          },
        })
      } else {
        req({code: 400, msg: '当前微信登录不可用，微信未安装或者手机系统不支持'})
      }

    });
  },
}
